package com.Questions.DP;


import java.util.Arrays;

/**
 * 准时抵达会议现场的最小跳过休息次数
 */
public class leetcode1883 {
    static final double EPS = 1e-7;

    static final double INFTY=1e20;
    public int minSkips(int[] dist, int speed, int hoursBefore) {
        // f[i][j] 表示dist[0]到dist[i-1]的i段道路 并且跳过了j次最短用时
        //  在dist[i-1]选择是否跳过休息 阶段
        // 如果没有跳过 f[i][j]=(f[i-1][j]+dist[i-1]/speed)向上取整
        // 如果跳过 f[i][j]=f[i-1][j-1]+dist[i-1]/speed
        // 状态转移方程取二者的最小值
        // j=0 不能跳过
        // j=i 不能没有跳过 当j>i时 状态不合法
        // f[][]
        int n=dist.length;
        double[][] f=new double[n+1][n+1];
        for(int i = 0; i <= n; ++i){
            Arrays.fill(f[i], INFTY);
        }
        f[0][0] = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 0; j <= i; ++j) {
                if(j != i) {
                    f[i][j] = Math.min(f[i][j],Math.ceil(f[i - 1][j] + (double) dist[i - 1] / speed - EPS));
                }
                if (j != 0) {
                    f[i][j] = Math.min(f[i][j], f[i - 1][j - 1] + (double) dist[i - 1] / speed);
                }
            }
        }
        for (int j = 0;j <= n; ++j) {
            if(f[n][j] < hoursBefore + EPS) {
                return j;
            }
        }
        return -1;
    }
}
